package com.magenta.maxoptra.commons.db;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;

/**
 * Created by IntelliJ IDEA.
 * User: andreytr
 * Date: 18.02.11
 * Time: 14:38
 */
public interface QueryExecuter {

    /**
     * Проверяет, ворачивает ли запрос хотя бы одну строку данных
     *
     * @return true, если запрос вернул данные, false, если данных не оказалось
     */
    public boolean resultExists(String statement) throws SQLException;

    /**
     * Проверяет, ворачивает ли запрос хотя бы одну строку данных
     *
     * @return true, если запрос вернул данные, false, если данных не оказалось
     */
    public boolean resultExists(String statement, Object[] params) throws SQLException;

    /**
     * Выполняет запрос на обновление
     *
     * @return Количество вставленных/обновленных строк
     */
    public int executeUpdate(String sql) throws SQLException;

    /**
     * Выполняет запрос на обновление
     *
     * @return Количество вставленных/обновленных строк
     */
    public int executeUpdate(String sql, Map<Integer, Object> params) throws SQLException;

    /**
     * Выполняет запрос на обновление
     *
     * @return Количество вставленных/обновленных строк
     */
    public int executeUpdate(String sql, Object[] params) throws SQLException;

    /**
     * Получение результатов выполнения запроса
     *
     * @return список. Элемент списка представляет собой одну строку результата запроса, выраженную массивом объектов
     */
    public List getResultList(String sql) throws SQLException;

    /**
     * Получение результатов выполнения запроса
     *
     * @return список. Элемент списка представляет собой одну строку результата запроса, выраженную массивом объектов
     */
    public List getResultList(String sql, Map<Integer, Object> params) throws SQLException;

    /**
     * {@link QueryExecuter#getResultList(String, java.util.Map) Описание}
     * <p/>
     * Выполняет запрос с ограничением на кол-во возвращаемых строк
     *
     * @param maxResults если указан 0, то нет ограничения
     */
    public List getResultList(String sql, Map<Integer, Object> params, int maxResults) throws SQLException;

    /**
     * Итератор по результату запроса
     *
     * @param sql               SQL-запрос для выполнения
     * @param resultSetCommand  Callback, вызываемый на каждой итерации
     * @return Количество итераций
     */
    public int iterateResultSet(String sql, ResultSetCommand resultSetCommand) throws SQLException;

    /**
     * Итератор по результату запроса
     *
     * @param sql               SQL-запрос для выполнения
     * @param params            Параметры для выполнения запроса
     * @param resultSetCommand  Callback, вызываемый на каждой итерации
     * @return Количество итераций
     */
    public int iterateResultSet(String sql, ResultSetCommand resultSetCommand, Map<Integer, Object> params) throws SQLException;

    /**
     * Получение мапы колонок таблицы
     *
     * @return Мапа наименования колонки на тип колонки
     */
    public Map<String, String> getColumns(String catalog, String schemaPattern,
			 String tableNamePattern, String columnNamePattern) throws SQLException;
}
